import java.util.*;

class Solution207 {
    public boolean canFinish(int n, int[][] prerequisites) {
        if(prerequisites.length <= 1) return true ;

        Map<Integer,Integer> rudu = new HashMap<>() ;
        // 记录 , 当前元素指向哪个元素
        Map<Integer, List<Integer>> map = new HashMap<>() ;
        List<Integer> nums = new ArrayList<>() ;
        for(int i=0 ; i < prerequisites.length ;i ++){
            int a  =  prerequisites[i][0] ;
            int b = prerequisites[i][1] ;
            rudu.put(a , rudu.getOrDefault(a , 0)+1) ;
            rudu.put(b , rudu.getOrDefault(b , 0)) ;
            if(!map.containsKey(b)){
                map.put(b , new ArrayList<>()) ;
                map.get(b).add(a) ;
            }else{
                map.get(b).add(a) ;
            }
        }

        Queue<Integer> queue = new LinkedList<>() ;
        for(int i=0 ; i < prerequisites.length ;i ++){
            int a  =  prerequisites[i][0] ;
            int b = prerequisites[i][1] ;
            if(rudu.get(a) == 0){
                queue.add(a) ;
            }
            if(rudu.get(b) == 0){
                queue.add(b) ;
            }
        }
        while(!queue.isEmpty()){
            int del = queue.poll() ;
            List<Integer> list = map.get(del) ;
            if(list != null ){
                for(int i : list){
                    rudu.put(i , rudu.get(i)-1) ;
                    if(rudu.get(i) == 0){
                        queue.add(i) ;
                    }
                }
            }
            rudu.remove(del) ;
            map.remove(del) ;
        }
        return rudu.isEmpty() && map.isEmpty()  ;

    }

}